﻿using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;
using Microsoft.Xna.Framework.Net;
using Microsoft.Xna.Framework.Storage;


namespace WindowsGame1
{
    class CollisionManager
    {
        List<ICollider> ListA = new List<ICollider>();
        List<ICollider> ListB = new List<ICollider>();
        
        float DistActX = 0.0f;
        float DistActY = 0.0f;
        float DistMinX = 0.0f;
        float DistMinY = 0.0f;
        float PenetracionX;
        float PenetracionY;
      
        public void update()
        {
            for (int i = 0; i < ListA.Count; i++)
            {
                ICollider objDeListaA = ListA[i];
                for (int j = 0; j < ListB.Count; j++)
                {
                    ICollider objDeListaB = ListB[j];
                    // verifica la colision
                    if (HayColision(objDeListaA, objDeListaB))
                    {//una vez que se ha detectado la colision se determina de que eje fue
                        if (PenetracionX > PenetracionY)
                        {
                            objDeListaA.onColision();
                            objDeListaB.onColision();
                        }
                        else
                        {
                            objDeListaA.onColision();
                            objDeListaB.onColision();
                        }
                    }
                    
                }
                
            }

        }

        public bool HayColision(ICollider objA, ICollider objB)
        {
            //establece lo mas cerca que pueden estar
            DistMinX = objA.GetWidth() / 2 + objB.GetWidth() / 2;
            DistMinY = objA.GetHeight() / 2 + objB.GetHeight() / 2;

            Vector2 auxPosA = objA.GetPosition();
            Vector2 auxPosB = objB.GetPosition();

            //la dist a la que se encuentran cuadro a cuadro
            DistActX = Math.Abs(auxPosA.X - auxPosB.X);
            DistActY = Math.Abs(auxPosA.Y - auxPosB.Y);

            //esto verifica si hay colision y en tal caso establece de cuanto es la penetracion
            if (DistActX < DistMinX && DistActY < DistMinY)
            {
                PenetracionX = DistMinX - DistActX;
                PenetracionY = DistMinY - DistActY;
                return true;
            }
            else
            {
                PenetracionX = 0f;
                PenetracionY = 0f;
                return false;
            }
        }
        
        public void AddToListA(Actor a)
        {
            ListA.Add(a);
        }

        public void AddToListB(Actor a)
        {
            ListB.Add(a);
        }
    }
}
